home *** CD-ROM | disk | FTP | other *** search
/ Suzy B Software 2 / Suzy B Software CD-ROM 2 (1994).iso / new_file / programm / gemfsc19 / gemfsc19.lzh / GEMFUNCS / FRMDIAL.C < prev    next >
Encoding:
C/C++ Source or Header  |  1993-05-07  |  10.4 KB  |  434 lines

  1. /**************************************************************************
  2.  *
  3.  *************************************************************************/
  4.  
  5. #include "gemfintl.h"
  6.  
  7. /*----------------------------------------------------------------------------
  8.  *
  9.  *--------------------------------------------------------------------------*/
  10.  
  11. static XUBT_STATUS maybe_touch_object  __PROTO((OBJECT *ptree, short obj));
  12. static short       call_system_form_do __PROTO((FormControl *ctl));
  13. static short       find_mover_object   __PROTO((OBJECT *ptree));
  14.  
  15. /*-------------------------------------------------------------------------
  16.  *
  17.  *-----------------------------------------------------------------------*/
  18.  
  19. #define NO_FLAGS        (-1)
  20. #define BLITOPTIONS     (FRM_USEBLIT|FRM_MOVEABLE)
  21. #define CTL_ALLOCATED    0x80000000L
  22.  
  23. long  _FrmDefaults    = FRM_NORMAL;
  24.  
  25. long         (*_FrBltVector) __PROTO((short options, void *buffer, void *rect));
  26. static short (*default_form_do) __PROTO((FormControl *ctl)) = call_system_form_do;
  27.  
  28. /*-------------------------------------------------------------------------
  29.  *
  30.  *-----------------------------------------------------------------------*/
  31.  
  32. static short call_system_form_do(ctl)
  33.     register FormControl *ctl;
  34. {
  35.     return form_do(ctl->ptree, ctl->editobj);
  36. }
  37.  
  38.  
  39. /*-------------------------------------------------------------------------
  40.  *
  41.  *-----------------------------------------------------------------------*/
  42.  
  43. static XUBT_STATUS maybe_touch_object(ptree, obj)
  44.     OBJECT *ptree;
  45.     short    obj;
  46. {
  47.     XUSERBLK    *xub;
  48.     short         clicks;
  49.     short         mx;
  50.     short         my;
  51.     short         dmy;
  52.  
  53.     clicks = (obj & 0x8000) ? 2 : 1;
  54.     obj &= 0x7FFF;
  55.  
  56.     if (NULL != (xub = XUBPTR(&ptree[obj]))) {
  57.         if (xub->ub_touch != NULL) {
  58.             graf_mkstate(&mx, &my, &dmy, &dmy);
  59.             return (*xub->ub_touch)(xub, mx, my, clicks);
  60.         }
  61.     }
  62.  
  63.     return XUBT_NONE;
  64.  
  65. }
  66.  
  67. /*-------------------------------------------------------------------------
  68.  *
  69.  *-----------------------------------------------------------------------*/
  70.  
  71. static short find_mover_object(ptree)
  72.     register OBJECT *ptree;
  73. {
  74.     register OBJECT *pobj      = ptree;
  75.     register short       obj        = 0;
  76.     register short       ob_flags;
  77.  
  78.     for (;;) {
  79.         ob_flags = pobj->ob_flags;
  80.         if (ob_flags & FRM_MOVER) {
  81.             return obj;
  82.         }
  83.         if (ob_flags & LASTOB) {
  84.             return NO_OBJECT;
  85.         }
  86.         ++obj;
  87.         ++pobj;
  88.     }
  89. }
  90.  
  91. /*-------------------------------------------------------------------------
  92.  *
  93.  *-----------------------------------------------------------------------*/
  94.  
  95. FormControl *_FrmSetup(ctl, options, ptree, pboundrect)
  96.     register FormControl *ctl;
  97.     register long         options;
  98.     register OBJECT      *ptree;
  99.     register GRECT         *pboundrect;
  100. {
  101.     if (pboundrect == NULL) {
  102.         pboundrect = &gl_rwdesk;
  103.     }
  104.  
  105.     if (!(options & FRM_NODEFAULTS)) {
  106.         options |= _FrmDefaults;
  107.     }
  108.  
  109.     ctl->ptree          = ptree;
  110.     ctl->pboundrect   = pboundrect;
  111.     ctl->options      = options & FRM_OPTIONBITS;
  112.     ctl->form_do      = default_form_do;
  113.     ctl->editobj      = ROOT;
  114.     ctl->parentobj      = ROOT;
  115.     ctl->moverobj      = NO_OBJECT;
  116.     ctl->treeflags      = NO_FLAGS;
  117.     ctl->select_state = SELECTED;
  118.     ctl->blitbuffer   = NULL;
  119.  
  120.     if (options & FRM_DSTART) {
  121.         if (options & FRM_NEARMOUSE) {
  122.             short mx, my, dmy;
  123.             graf_mkstate(&mx, &my, &dmy, &dmy);
  124.             ptree->ob_x = mx - (ptree->ob_width  / 2);
  125.             ptree->ob_y = my - (ptree->ob_height / 2);
  126.             frm_confine(ptree, pboundrect);
  127.         } else if (options & FRM_CENTER) {
  128.             frmx_center(ptree, &ctl->scrnrect);
  129.         }
  130.     }
  131.  
  132.     frm_sizes(ptree, &ctl->scrnrect);
  133.     rc_scale(&ctl->scrnrect, &ctl->littlerect, 20);
  134.  
  135.     if (options & FRM_DSTART) {
  136.         if ((options & BLITOPTIONS) && _FrBltVector != NULL) {
  137.             long blitbytes;
  138.             blitbytes = (*_FrBltVector)(GRF_BMEMCALC, NULL, &ctl->scrnrect);
  139.             if (NULL != (ctl->blitbuffer = apl_malloc(blitbytes))) {
  140.                 ctl->moverobj = find_mover_object(ptree);
  141.                 if (ctl->moverobj == NO_OBJECT && (options & FRM_MOVEABLE)) {
  142.                     ctl->moverobj  = ROOT;
  143.                     ctl->treeflags = frm_mkmoveable(ptree, ROOT);
  144.                 }
  145.             }
  146.         }
  147.     }
  148.  
  149.     return ctl;
  150. }
  151.  
  152. /*-------------------------------------------------------------------------
  153.  *
  154.  *-----------------------------------------------------------------------*/
  155.  
  156. void frm_cleanup(ctl)
  157.     register FormControl *ctl;
  158. {
  159.     if (ctl != NULL) {
  160.         if (ctl->blitbuffer != NULL) {
  161.             apl_free(ctl->blitbuffer);
  162.         }
  163.         if (ctl->ptree != NULL && ctl->treeflags != NO_FLAGS) {
  164.             ctl->ptree->ob_flags = ctl->treeflags;
  165.         }
  166.         if (ctl->options & CTL_ALLOCATED) {
  167.             apl_free(ctl);
  168.         }
  169.     }
  170. }
  171.  
  172. /*-------------------------------------------------------------------------
  173.  *
  174.  *-----------------------------------------------------------------------*/
  175.  
  176. FormControl *frm_init(options, ptree, pboundrect)
  177.     long        options;
  178.     OBJECT        *ptree;
  179.     GRECT        *pboundrect;
  180. {
  181.     FormControl *ctl;
  182.  
  183.     if (NULL == (ctl = apl_malloc((long)sizeof(FormControl)))) {
  184.         return NULL;
  185.     } else {
  186.         _FrmSetup(ctl, options|FRM_DSTART, ptree, pboundrect);
  187.         ctl->options |= CTL_ALLOCATED;
  188.         return ctl;
  189.     }
  190. }
  191.  
  192. /*-------------------------------------------------------------------------
  193.  *
  194.  *-----------------------------------------------------------------------*/
  195.  
  196. void frm_start(ctl)
  197.     register FormControl *ctl;
  198. {
  199.     if (ctl->blitbuffer != NULL) {
  200.         (*_FrBltVector)(GRF_BFROMSCREEN, ctl->blitbuffer, &ctl->scrnrect);
  201.     }
  202.  
  203.     frmx_dial(FMD_START, &ctl->littlerect, &ctl->scrnrect);
  204.  
  205.     if (ctl->options & FRM_EXPLODE) {
  206.         frmx_dial(FMD_GROW,  &ctl->littlerect, &ctl->scrnrect);
  207.     }
  208.  
  209. }
  210.  
  211. /*-------------------------------------------------------------------------
  212.  *
  213.  *-----------------------------------------------------------------------*/
  214.  
  215. void frm_draw(ctl, obj)
  216.     register FormControl *ctl;
  217.     short                   obj;
  218. {
  219.     objc_draw(ctl->ptree, obj, MAX_DEPTH, RECTVALS(ctl->pboundrect));
  220. }
  221.  
  222. /*-------------------------------------------------------------------------
  223.  *
  224.  *-----------------------------------------------------------------------*/
  225.  
  226. void frm_finish(ctl)
  227.     register FormControl *ctl;
  228. {
  229.     if (ctl->options & FRM_EXPLODE) {
  230.         frmx_dial(FMD_SHRINK, &ctl->littlerect, &ctl->scrnrect);
  231.     }
  232.  
  233.     if (ctl->blitbuffer != NULL) {
  234.         (*_FrBltVector)(GRF_BTOSCREEN, ctl->blitbuffer, &ctl->scrnrect);
  235.     } else {
  236.         frmx_dial(FMD_FINISH, &ctl->littlerect, &ctl->scrnrect);
  237.         evnx_timer(1L);
  238.     }
  239.  
  240. }
  241.  
  242. /*-------------------------------------------------------------------------
  243.  *
  244.  *-----------------------------------------------------------------------*/
  245.  
  246. void frm_move(ctl)
  247.     register FormControl *ctl;
  248. {
  249.     short             oldmouse;
  250.     short             mb;
  251.     short             dmy;
  252.     register short     adjust;
  253.     register GRECT *prect = (GRECT *)&ctl->ptree->ob_x;
  254.  
  255.     if (ctl->blitbuffer == NULL) {
  256.         return;
  257.     }
  258.  
  259.     /*
  260.      * delay very briefly, then see if the mouse button is still down.
  261.      * if it's not, just return.  this prevents false 'moves' when all
  262.      * the user did was miss the button s/he was after.
  263.      */
  264.  
  265.     evnx_timer(75L);
  266.     graf_mkstate(&dmy, &dmy, &mb, &dmy);
  267.     if (!mb) {
  268.         return;
  269.     }
  270.  
  271.     (*_FrBltVector)(GRF_BTOSCREEN, ctl->blitbuffer, &ctl->scrnrect);
  272.  
  273.     adjust = obj_clcalc(ctl->ptree, ROOT, NULL, NULL);
  274.     rc_gadjust(prect, adjust, adjust);
  275.  
  276.     oldmouse = graf_mouse(FLAT_HAND, NULL);
  277.     grfx_dragbox(prect, ctl->pboundrect, prect);
  278.     graf_mouse(oldmouse, NULL);
  279.  
  280.     adjust = -adjust;
  281.     rc_gadjust(prect, adjust, adjust);
  282.  
  283.     frm_sizes(ctl->ptree, &ctl->scrnrect);
  284.     (*_FrBltVector)(GRF_BFROMSCREEN, ctl->blitbuffer, &ctl->scrnrect);
  285.     frm_draw(ctl, ROOT);
  286. }
  287.  
  288. /*-------------------------------------------------------------------------
  289.  *
  290.  *-----------------------------------------------------------------------*/
  291.  
  292. short frm_do(ctl, editobj)
  293.     register FormControl *ctl;
  294.     short                   editobj;
  295. {
  296.     short oldmouse;
  297.     short more_interaction;
  298.     short rv;
  299.     short obj;
  300.     XUBT_STATUS status;
  301.  
  302.     if (ctl->options & FRM_MOUSEARROW) {
  303.         oldmouse = graf_mouse(ARROW, 0L);
  304.     }
  305.  
  306.     ctl->editobj = editobj;
  307.  
  308.     do    {
  309.         more_interaction = FALSE;
  310.         obj = 0x7FFF & (rv = (*ctl->form_do)(ctl));
  311.         if (rv == NO_OBJECT) {
  312.             goto QUICK_EXIT;
  313.         }
  314.         if (obj == ctl->moverobj) {
  315.             more_interaction = TRUE;
  316.             frm_move(ctl);
  317.         }
  318.         if (ctl->ptree[obj].ob_flags & TOUCHEXIT) {
  319.             if (ctl->ptree[obj].ob_state & DISABLED) {
  320.                 more_interaction = TRUE;
  321.             } else {
  322.                 if (OBGTYPE(&ctl->ptree[obj]) == G_USERDEF) {
  323.                     more_interaction = TRUE;
  324.                     status = maybe_touch_object(ctl->ptree, rv);
  325.                     if (status & XUBT_DCEXIT) {
  326.                         if (NO_OBJECT != (rv = obj = obj_dxfind(ctl->ptree))) {
  327.                             more_interaction = FALSE;
  328.                         }
  329.                     }
  330.                 }
  331.             }
  332.         }
  333.     } while (more_interaction);
  334.  
  335.     if (ctl->ptree[obj].ob_flags & (EXIT|DEFAULT)) {
  336.         evnx_timer(70L);
  337.         obj_stchange(ctl->ptree, obj, ~ctl->select_state,
  338.             OBJ_CLIPDRAW, ctl->pboundrect);
  339.     }
  340.  
  341. QUICK_EXIT:
  342.  
  343.     if (ctl->options & FRM_MOUSEARROW) {
  344.         graf_mouse(oldmouse, 0L);
  345.     }
  346.  
  347.     return rv;
  348. }
  349.  
  350. /*-------------------------------------------------------------------------
  351.  *
  352.  *-----------------------------------------------------------------------*/
  353.  
  354. short frm_dialog(options, ptree, object)
  355.     long    options;
  356.     OBJECT *ptree;
  357.     short      object;
  358. {
  359.     FormControl ctl;
  360.     short          selobj;
  361.     long        actions;
  362.  
  363.     if (0 == (actions = options & FRM_ACTIONBITS)) {
  364.         options  |= (actions = FRM_DCOMPLETE);
  365.     }
  366.  
  367.     if (actions == FRM_DCOMPLETE) {
  368.         wind_update(BEG_UPDATE);
  369.     } else {
  370.         if (options & BLITOPTIONS) {
  371.             options &= ~BLITOPTIONS;
  372.         }
  373.     }
  374.  
  375.     _FrmSetup(&ctl, options, ptree, NULL);
  376.  
  377.     if (actions & FRM_DSTART) {
  378.         frm_start(&ctl);
  379.     }
  380.  
  381.     if (actions & FRM_DDRAW) {
  382.         frm_draw(&ctl, (options & FRM_DSTART) ? ROOT : object);
  383.     }
  384.  
  385.     if (actions & FRM_DDO) {
  386.         selobj = frm_do(&ctl, object);
  387.     }
  388.  
  389.     if (actions & FRM_DFINISH) {
  390.         frm_finish(&ctl);
  391.     }
  392.  
  393.     frm_cleanup(&ctl);
  394.  
  395.     if (actions == FRM_DCOMPLETE) {
  396.         wind_update(END_UPDATE);
  397.     }
  398.  
  399.     return selobj;
  400. }
  401.  
  402. /*-------------------------------------------------------------------------
  403.  *
  404.  *-----------------------------------------------------------------------*/
  405.  
  406. long frm_defaults(options)
  407.     long options;
  408. {
  409.     long rv = _FrmDefaults;
  410.  
  411.     if (options != FRM_GETDEFAULTS) {
  412.         _FrmDefaults = options & FRM_OPTIONBITS & ~FRM_NODEFAULTS;
  413.     }
  414.     return rv;
  415. }
  416.  
  417. /*-------------------------------------------------------------------------
  418.  *
  419.  *-----------------------------------------------------------------------*/
  420.  
  421. void *frm_dovector(newfunc)
  422.     void *newfunc;
  423. {
  424.     void *rv = default_form_do;
  425.  
  426.     if (newfunc != NULL) {
  427.         default_form_do = newfunc;
  428.     }
  429.     return rv;
  430. }
  431.  
  432.  
  433.  
  434.